Я перелічую контакти з веб-служби та відображаю їх у списку контактів "section" tableView, як показано на скріншоті. Проблема полягає в тому, що я отримую однакові значення тегів для прапорців першого рядка для розділу A, а також розділу S. Я відсортував один масив і відобразив у поданні індексованої таблиці. Як отримати різні значення тегів залежно від indexPath.row незалежно від кількості відображених розділів. Ось що я спробував У комірціForRowAtIndexPath: UIButton * checkBox; якщо (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPhone) { checkBox = [[UIButton alloc] initWithFrame: CGRectMake (7, 8, 30, 30)]; } ще { checkBox = [[UIButton alloc] initWithFrame: CGRectMake (15, 13, 30, 30)]; } // int cnt = 0; // for (int i = indexPath.section - 1; i> 0; i--) // { // cnt + = [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: i]] count]; // arrayOfCharachters має символи від "A" до "Z" //} //checkBox.tag = cnt + indexPath.row; [checkBox setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]; [checkBox addTarget: самодіяльність: @selector (checkBoxClicked :) forControlEvents: UIControlEventTouchUpInside]; [checkBox setTag: indexPath.row]; [cell.contentView addSubview: checkBox]; зворотна комірка; } - (void) checkBoxClicked: (id) відправник { CGPoint buttonPosition = [sender convertPoint: CGPointZero toView: self.tableViewContact]; NSIndexPath * indexPath = [self.tableViewContact indexPathForRowAtPoint: buttonPosition]; UIButton * tappedButton = (UIButton *) відправник; NSLog (@ "Номер тегу =% d", [тег відправника]); якщо ([tappedButton.currentImage isEqual: [UIImage imageNamed: @ "checkBox.png"]]) { [відправник setImage: [UIImage imageNamed: @ "checkBoxMarked.png"] forState: UIControlStateNormal]; якщо (indexPath! = Nil) { NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; // зберігаємо ідентифікатори прапорців у mutableArrayOfIds NSLog (@ "Ідентифікатор кнопки з позначкою тегом =% @", finalIntId); [arrayOfIds addObject: finalIntId]; } // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: tappedButton.tag]; // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; } ще { [відправник setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]; NSLog (@ "Не перевірено"); // [arrayOfIds removeObjectAtIndex: tappedButton.tag]; } } - (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) section { if ([arrayOfCharacters count] == 0) { повернути @ ""; } повернути [NSString stringWithFormat: @ "% @", [arrayOfCharacters objectAtIndex: section]]; } - (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView { NSArray * toBeReturned = [масив NSArrayWithArray: [@ "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | # " componentsSeparatedByString: @ "|"]]; повернутися доBeReturned; } - (NSInteger) tableView: (UITableView *) tableView sectionForSectionIndexTitle: (NSString *) title atIndex: (NSInteger) index { NSInteger count = 0; для (символ NSString * у масивіOfCharacters) { якщо ([символ isEqualToString: заголовок]) { кількість повернень; } рахувати ++; } повернути 0; } - (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView { повернення [arrayOfCharacters count]; // повернення 1; } - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: розділ (NSInteger) { // повертаємо [mutableArray count]; повернути [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: section]] count]; }
2020-12-07 22:56:09
ви встановлюєте однакове значення тегу для всіх розділів, які мають однаковий рядок. IndexPath має дві властивості, {section, row}. Скажімо, розділ A має два рядки, для row1 -> indexPath.section = 0, indexPath.row = 0; для row2-> indexPath.section = 0, indexPath.row = 1; Скажімо, розділ S має два рядки, для row1 -> indexPath.section = 1, indexPath.row = 0; для row2-> indexPath.section = 1, indexPath.row = 1; Отже, для рядка1 розділу A та рядка1 розділу S ви встановлюєте одне і те ж значення тегу, яке дорівнює 0. Виникає ваша проблема. Спробуйте встановити значення тегу, як показано нижче. button.tag = indexPath.section * 1000 + indexPath.row; при отриманні розділу та рядка, Розділ NSInteger = (button.tag) / 1000; NSInteger рядок = (button.tag)% 1000; | Спробуйте це... - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { статичний NSString * CellIdentifier = @ "Cell"; UITableViewCell * комірка = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; if (комірка == нуль) { комірка = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier]; } UIButton * checkBox = [[UIButton alloc] initWithFrame: CGRectMake (280, 10, 50, 44)]; checkBox.backgroundColor = [UIColor orangeColor]; [checkBox addTarget: самодіяльність: @selector (checkBoxClicked: event:) forControlEvents: UIControlEventTouchUpInside]; [checkBox setTag: indexPath.row]; [cell.contentView addSubview: checkBox]; зворотна комірка; } - (void) checkBoxClicked: (id) подія відправника: (id) подія { NSSet * дотики = [подія allTouches]; UITouch * touch = [торкається будь-якого об’єкта]; CGPoint currentTouchPosition = [сенсорне розташуванняInView: self.tv]; // тут телевізор - це об’єкт TableView NSIndexPath * indexPath = [self.tv indexPathForRowAtPoint: currentTouchPosition]; NSLog (@ "значення indePath.section% d, indexPath.row% d", indexPath.section, indexPath.row); } | Це відбувається тому, що ви призначаєте тег кнопкам НЕЗАЛЕЖНО розділів. В обох перших рядках розділів A & S є рядок = 0. тому Тег, призначений відповідній кнопці, дорівнює 0. Ви повинні призначити їм Зберігаючи посилання на свої розділи. я б запропонував призначити підказку про доступність у формі, відокремленій комами, що містить Розділ, Рядок. І у вашому методі - (void) checkBoxClicked: (id) відправник { // вибираємо рядок із форми, розділеної комами. 1-й - це ваш розділ, 2-й - ряд. } другий варіант - робити все, що завгодно, і впровадити метод Button таким чином. CGPoint buttonPosition = [sender convertPoint: CGPointZero toView: self.tableView]; NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: buttonPosition]; якщо (indexPath! = нуль) { ... indexpath.section - це ваш розділ, index path.row - ваш рядок. } Є і третій варіант. в cellforRowAtIndexpath присвоїти вашій кнопці заголовок - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath [btn setTitle: <# Your Row #> forState: UIControlStateDisabled]; [btn setTag <# Ваш розділ #>]; тож при отриманні методом кнопки ви можете мати як розділ (тег), так і рядок (заголовок для стану інвалідів). - (void) checkBoxClicked: (id) sender {[button titleForState: UIControlStateDisabled]; // ваш рядок button.tag // ваш розділ} | Спробуйте це! У кожному розділі ви можете знати кількість розділів праворуч, а потім додайте кількість окремих рядків. [[fieldTitlesList objectAtIndex: indexPath.section - 1] count] + indexPath.row Де fieldTitlesList - це масив ваших розділів. | Я додав наступний код, який вирішив мою проблему NSInteger rowNumber = 0; для (NSInteger i = 0; i